package cn.darkhorse.messystem.service.impl;


import cn.darkhorse.common.constant.CommonConstant;
import cn.darkhorse.messystem.mapper.MesSystemOptionsMapper;
import cn.darkhorse.messystem.pojo.MesSystemOptions;
import cn.darkhorse.messystem.service.MesSystemOptionsService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.core.domain.entity.SysRole;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.util.Arrays;
import java.util.List;

/**
 * <p>
 * 系统配置表（报修审核开关） 服务实现类
 * </p>
 *
 * @author yangtianqi
 * @since 2024-05-09
 */
@Service
public class MesSystemOptionsServiceImpl extends ServiceImpl<MesSystemOptionsMapper, MesSystemOptions> implements MesSystemOptionsService {


    @Override
    public MesSystemOptions view(String key) {
        if(StringUtils.isBlank(key)){
            key="system";
        }
        QueryWrapper<MesSystemOptions> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("key_word",key);
        MesSystemOptions options = getOne(queryWrapper);
//        获取不到配置信息时，创建默认配置
        if (options == null){
            options = createDefaultOptions(key);
        }

        return options;
    }

    @Override
    public boolean saveOptions(MesSystemOptions options) {
        if(StringUtils.isBlank(options.getKeyWord())){
            options.setKeyWord("system");
        }
        QueryWrapper<MesSystemOptions> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("key_word",options.getKeyWord());
        MesSystemOptions one = getOne(queryWrapper);
        if (one != null){
            options.setId(one.getId());
        }
        return saveOrUpdate(options);
    }

    @Override
    public boolean authenticationAudit(String key) {
//        直接调view接口即可，业务逻辑相同
//        MesSystemOptions options = view(key);
//
//        if (options.getEnableRepairAudit().equals(0)){
//            return false;
//        }
        return hasAnyRolesByKey(key);
    }

    @Override
    public boolean authenticationVerify(String key,Long id) {
        MesSystemOptions options = view(key);
        if (StringUtils.isBlank(options.getRepairValidators())){
            return false;
        }
        List<String> list = Arrays.asList(options.getRepairValidators().split(","));
//        多选时，满足其中一种条件即可返回true
        for (String type : list) {
            if (CommonConstant.REPAIR_VERIFY_SELF.equals(type)){
//            个人验证
                if (null != id){
                    LoginUser user = SecurityUtils.getLoginUser();
                    if (id.equals(user.getUserId())){
                        return true;
                    }
                }
            }else if (CommonConstant.REPAIR_VERIFY_DESIGNATE.equals(type)){
//                指定角色组验证
                boolean hasAnyRoles = hasAnyRolesById(options.getRepairValidatorsRoles());
                if (hasAnyRoles){
                    return true;
                }
            }
        }



        return false;
    }


    /**
     * 验证用户是否具有以下任意一个角色
     *
     * @param roles 以 ROLE_NAMES_DELIMETER 为分隔符的角色列表
     * @return 用户是否具有以下任意一个角色
     */
    @Override
    public boolean hasAnyRolesById(String roles)
    {
        if (StringUtils.isEmpty(roles))
        {
            return false;
        }
        LoginUser loginUser = SecurityUtils.getLoginUser();

        if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getUser().getRoles()))
        {
            return false;
        }
        for (String role : roles.split(","))
        {
            for (SysRole sysRole : loginUser.getUser().getRoles())
            {
                String id = sysRole.getRoleId().toString();
                if (id.equals(role))
                {
                    return true;
                }
            }
        }
        return false;
    }

    @Override
    public boolean hasAnyRolesByKey(String key)
    {

        MesSystemOptions options = view(key);
        String roles = options.getRepairAuditRoles();
        if (options.getEnableRepairAudit().equals(0)){
            return false;
        }

        if (StringUtils.isEmpty(roles))
        {
            return false;
        }
        LoginUser loginUser = SecurityUtils.getLoginUser();


        //        测试专用特殊处理 --开始
        if ("admin".equals(loginUser.getUser().getUserName())){
            for (String role : roles.split(","))
            {
                if ("1".equals(role)){
                    return true;
                }
            }
        }
        //        测试专用特殊处理 --结束




        if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getUser().getRoles()))
        {
            return false;
        }
        for (String role : roles.split(","))
        {
            for (SysRole sysRole : loginUser.getUser().getRoles())
            {
                String id = sysRole.getRoleId().toString();
                if (id.equals(role))
                {
                    return true;
                }
            }
        }
        return false;
    }

    /**
     * 创建默认设置
     * @param key
     * @return
     */
    public MesSystemOptions createDefaultOptions(String key){
        MesSystemOptions options = new MesSystemOptions();
        options.setKeyWord(key);
        options.setEnableRepairAudit(0);  //默认关闭审核
        options.setRepairValidators("1"); // 默认选择自己为维修验证人
        save(options);
        return options;
    }
}
